﻿using ProyectoDeTesis.Controladores;
using System;
using System.ComponentModel;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Telerik.WinControls.UI;

namespace ProyectoDeTesis.Vistas
{
    public partial class EditarVuelo : Form
    {
        private int pantalla_id = 15;
        private int vuelo_id;
        private VueloController vueloController = new VueloController();

        public EditarVuelo()
        {
            InitializeComponent();
        }

        public EditarVuelo(int vuelo_id)
        {
            // TODO: Complete member initialization
            this.vuelo_id = vuelo_id;
            InitializeComponent();
            cargarDatosVuelo();
        }

        private void cargarDatosVuelo()
        {
            ProyectoDeTesis.Vuelo vuelo = vueloController.obtenerVueloxId(vuelo_id);

            tbxDestino.Text = vuelo.nombre_destino;
            tbxEquipajes.Text = Convert.ToString(vuelo.carga);
            tbxNombreAeropuerto.Text = vuelo.nombre_aeropuerto;
            tbxNumVuelo.Text = vuelo.num_vuelo;
            tbxOrigen.Text = vuelo.nombre_origen;
            tbxPasajeros.Text = Convert.ToString(vuelo.num_pasajeros);
            tbxTipoAvion.Text = vuelo.Tipo_avion;
            rdtFechaLlegada.Value = Convert.ToDateTime(vuelo.fecha_llegada);
            rdtFechaSalida.Value = vuelo.fecha_salida;
            cmbTipoVuelo.SelectedItem = vuelo.tipo_vuelo;
            rdtHoraLlegada.Value = DateTime.ParseExact(vuelo.hora_llegada, "HH:mm", CultureInfo.CurrentCulture);
            rdtHoraSalida.Value = DateTime.ParseExact(vuelo.hora_salida, "HH:mm", CultureInfo.CurrentCulture);
            
        }

        public bool resultadoVentana { get; set; }

        private void BtnCancelar_Click(object sender, System.EventArgs e)
        {
            this.Dispose();
        }

        private void BtnCancel_Click(object sender, System.EventArgs e)
        {
            this.Dispose();
        }

        private void BtnGuardar_Click(object sender, System.EventArgs e)
        {
            guardarVuelo();
        }

        private void guardarVuelo()
        {
            string num_vuelo = tbxNumVuelo.Text;
            string tipo_avion = tbxTipoAvion.Text;
            string tipo_vuelo = Convert.ToString(cmbTipoVuelo.SelectedItem);
            DateTime fecha_salida = rdtFechaSalida.Value;
            DateTime fecha_llegada = rdtFechaLlegada.Value;
            string hora_salida = rdtHoraSalida.Value.ToString("HH:mm");
            string hora_llegada = rdtHoraLlegada.Value.ToString("HH:mm");
            string nombre_aeropuerto = tbxNombreAeropuerto.Text;
            string origen = tbxOrigen.Text;
            string destino = tbxDestino.Text;
            int pasajeros = Convert.ToInt32(tbxPasajeros.Text);
            double equipajes = Convert.ToDouble(tbxEquipajes.Text);

            if (vueloController.actualizarVuelo(vuelo_id, num_vuelo, tipo_avion, tipo_vuelo, fecha_salida, fecha_llegada, hora_salida, hora_llegada, nombre_aeropuerto, origen, destino, pasajeros, equipajes))
            {
                FormAceptar aceptar = new FormAceptar("Se actualizo el vuelo correctamente.");
                aceptar.ShowDialog(this);
                this.resultadoVentana = true;
                this.Dispose();
            }
            else
            {
                this.resultadoVentana = false;
            }
        }

        private void btnAceptar_Click(object sender, System.EventArgs e)
        {
            guardarVuelo();
        }

        

        private void AddErrorLabel(string propertyName, string errorMessage)
        {
            if (!this.Controls.ContainsKey("lbl" + propertyName))
            {
                RadLabel label = new RadLabel();
                label.Name = "lbl" + propertyName; 
                label.Text = "Vuelo: " + errorMessage; 
                label.Dock = DockStyle.Top; 
                label.MaximumSize = new System.Drawing.Size(480, 0); 
                label.TextWrap = true;
                this.Controls.Add(label);
            }
        }

        private void tbxNumVuelo_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(tbxNumVuelo, "");
        }

        private void tbxNumVuelo_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarVuelo(tbxNumVuelo.Text, out mensajeError))
            {
                e.Cancel = true;
                tbxNumVuelo.Select(0, tbxNumVuelo.Text.Length);
                errorProvider1.SetError(tbxNumVuelo, mensajeError);
            }

            
        }

        private bool validarVuelo(string vuelo, out string mensajeError)
        {
            if (vuelo.Length < 4 || vuelo.Length > 7 || !Regex.IsMatch(vuelo, @"^[A-Z]{2,3}[0-9]{2,4}$"))
            {
                mensajeError = "Vuelo debería tener entre 4 y 7 y debe tener el siguiente formato 'AB[C]12[34]'";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Top; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }            
        }

        private void tbxTipoAvion_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(tbxTipoAvion,"");
        }

        private void tbxTipoAvion_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarTipoAvion(tbxTipoAvion.Text, out mensajeError))
            {
                e.Cancel = true;
                tbxTipoAvion.Select(0, tbxTipoAvion.Text.Length);
                errorProvider1.SetError(tbxTipoAvion, mensajeError);
            }

        }

        private bool validarTipoAvion(string tipoVuelo, out string mensajeError)
        {
            if (!String.IsNullOrEmpty(tipoVuelo) && !Regex.IsMatch(tipoVuelo, @"^[A-Z0-9]{3,4}$"))
            {
                mensajeError = "Tipo de Vuelo puede ser vacío o tener un máximo de 4. Deberá tener el siguiente formato 'A123[4]'";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Top; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }   
        }

        private void tbxNombreAeropuerto_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(tbxNombreAeropuerto, "");
        }

        private void tbxNombreAeropuerto_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarNombreAeropuerto(tbxNombreAeropuerto.Text, out mensajeError))
            {
                e.Cancel = true;
                tbxNombreAeropuerto.Select(0, tbxNombreAeropuerto.Text.Length);
                errorProvider1.SetError(tbxNombreAeropuerto, mensajeError);
            }

        }

        private bool validarNombreAeropuerto(string NombreAeropuerto, out string mensajeError)
        {
            if (!String.IsNullOrEmpty(NombreAeropuerto) && !Regex.IsMatch(NombreAeropuerto, @"^[a-zA-Z ']+$"))
            {
                mensajeError = "Deberá contener solo letras";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Top; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }


        }

        private void tbxDestino_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(tbxDestino, "");
        }

        private void tbxDestino_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarDestino(tbxDestino.Text, out mensajeError))
            {
                e.Cancel = true;
                tbxDestino.Select(0, tbxDestino.Text.Length);
                errorProvider1.SetError(tbxDestino, mensajeError);
            }
        }

        private bool validarDestino(string destino, out string mensajeError)
        {
            if (!Regex.IsMatch(destino, @"^[a-zA-Z ]+$"))
            {
                mensajeError = "Deberá contener solo letras";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Top; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }
        }

        private void tbxPasajeros_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(tbxPasajeros, "");
        }

        private void tbxPasajeros_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarPasajero(tbxPasajeros.Text, out mensajeError))
            {
                e.Cancel = true;
                tbxPasajeros.Select(0, tbxPasajeros.Text.Length);
                errorProvider1.SetError(tbxPasajeros, mensajeError);
            }
        }

        private bool validarPasajero(string pasajeros, out string mensajeError)
        {
            if ( !Regex.IsMatch(pasajeros, @"^[0-9]{1,3}$"))
            {
                mensajeError = "Deberá contener solo números";
                labelmessage.Text = "(*) "+mensajeError;
                //labelmessage.Dock = DockStyle.Fill; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }
        }

        private void tbxEquipajes_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarEquipaje(tbxEquipajes.Text, out mensajeError))
            {
                e.Cancel = true;
                tbxEquipajes.Select(0, tbxEquipajes.Text.Length);
                errorProvider1.SetError(tbxEquipajes, mensajeError);
            }
        }

        private bool validarEquipaje(string equipaje, out string mensajeError)
        {
            if (!Regex.IsMatch(equipaje, @"^[0-9]{1,8}$"))
            {
                mensajeError = "Deberá contener solo números";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Fill; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }
        }

        private void tbxEquipajes_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(tbxEquipajes, "");
        }





        private bool validarFechaSalida(DateTime FechaSalida, DateTime FechaLlegada, out string mensajeError)
        {
            if (FechaSalida > FechaLlegada)
            {
                mensajeError = "Fecha mayor que la fecha de LLegada";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Fill; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }
        }

        private void rdtFechaSalida_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarFechaSalida(rdtFechaSalida.Value,rdtFechaLlegada.Value, out mensajeError))
            {
                e.Cancel = true;
                rdtFechaSalida.Select();
                errorProvider1.SetError(rdtFechaSalida, mensajeError);

            }
        }

        private void rdtFechaSalida_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(rdtFechaSalida, "");
        }

        private void rdtFechaLlegada_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(rdtFechaLlegada, "");
        }

        private void rdtFechaLlegada_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarFechaLlegada(rdtFechaSalida.Value, rdtFechaLlegada.Value, out mensajeError))
            {
                e.Cancel = true;
                rdtFechaLlegada.Select();
                errorProvider1.SetError(rdtFechaLlegada, mensajeError);

            }
        }

        private bool validarFechaLlegada(DateTime FechaSalida, DateTime FechaLlegada, out string mensajeError)
        {
            if (FechaSalida > FechaLlegada)
            {
                mensajeError = "Fecha menor que la fecha de Salida";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Fill; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }
        }

        private void rdtHoraSalida_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(rdtHoraSalida, "");
        }

        private void rdtHoraSalida_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarHoraSalida(rdtFechaSalida.Value, rdtFechaLlegada.Value,rdtHoraSalida.Value, rdtHoraLlegada.Value, out mensajeError))
            {
                e.Cancel = true;
                rdtHoraSalida.Select();
                errorProvider1.SetError(rdtHoraSalida, mensajeError);

            }
        }

        private bool validarHoraSalida(DateTime FechaSalida, DateTime FechaLlegada,DateTime HoraSalida, DateTime HoraLlegada, out string mensajeError)
        {
            if ((HoraSalida > HoraLlegada) && (FechaSalida == FechaLlegada))
            {
                mensajeError = "Hora menor que la Hora de Salida";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Fill; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            }            
        }

        private void rdtHoraLlegada_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(rdtHoraLlegada, "");
        }

        private void rdtHoraLlegada_Validating(object sender, CancelEventArgs e)
        {
            string mensajeError;
            if (!validarHoraLlegada(rdtFechaSalida.Value, rdtFechaLlegada.Value, rdtHoraSalida.Value, rdtHoraLlegada.Value, out mensajeError))
            {
                e.Cancel = true;
                rdtHoraLlegada.Select();
                errorProvider1.SetError(rdtHoraLlegada, mensajeError);

            }
        }

        private bool validarHoraLlegada(DateTime FechaSalida, DateTime FechaLlegada, DateTime HoraSalida, DateTime HoraLlegada, out string mensajeError)
        {
            if ((HoraSalida > HoraLlegada) && (FechaSalida == FechaLlegada))
            {
                mensajeError = "Hora menor que la Hora de Salida";
                labelmessage.Text = "(*) " + mensajeError;
                //labelmessage.Dock = DockStyle.Fill; 
                return false;
            }
            else
            {
                mensajeError = "";
                labelmessage.Text = mensajeError;
                return true;
            } 
        }



    }
}
